29 research outputs found
Human-Centric Program Synthesis
Program synthesis techniques offer significant new capabilities in searching for programs that satisfy high-level specifications. While synthesis has been thoroughly explored for input/output pair specifications (programming-by-example), this paper asks: what does program synthesis look like beyond examples? What actual issues in day-to-day development would stand to benefit the most from synthesis? How can a human-centric perspective inform the exploration of alternative specification languages for synthesis? I sketch a human-centric vision for program synthesis where programmers explore and learn languages and APIs aided by a synthesis tool
From Theory to Systems: A Grounded Approach to Programming Language Education
I present a new approach to teaching a graduate-level programming languages course focused on using systems programming ideas and languages like WebAssembly and Rust to motivate PL theory. Drawing on students\u27 prior experience with low-level languages, the course shows how type systems and PL theory are used to avoid tricky real-world errors that students encounter in practice. I reflect on the curricular design and lessons learned from two years of teaching at Stanford, showing that integrating systems ideas can provide students a more grounded and enjoyable education in programming languages. The curriculum, course notes, and assignments are freely available: http://cs242.stanford.edu/f18
Identifying Barriers to Adoption for Rust through Online Discourse
Rust is a low-level programming language known for its unique approach to memory-safe systems programming and for its steep learning curve. To understand what makes Rust difficult to adopt, we surveyed the top Reddit and Hacker News posts and comments about Rust; from these online discussions, we identified three hypotheses about Rust\u27s barriers to adoption. We found that certain key features, idioms, and integration patterns were not easily accessible to new users
Debugging Trait Errors as Logic Programs
Rust uses traits to define units of shared behavior. Trait constraints build
up an implicit set of first-order hereditary Harrop clauses which is executed
by a powerful logic programming engine in the trait system. But that power
comes at a cost: the number of traits in Rust libraries is increasing, which
puts a growing burden on the trait system to help programmers diagnose errors.
Beyond a certain size of trait constraints, compiler diagnostics fall off the
edge of a complexity cliff, leading to useless error messages. Crate
maintainers have created ad-hoc solutions to diagnose common domain-specific
errors, but the problem of diagnosing trait errors in general is still open. We
propose a trait debugger as a means of getting developers the information
necessary to diagnose trait errors in any domain and at any scale. Our proposed
tool will extract proof trees from the trait solver, and it will interactively
visualize these proof trees to facilitate debugging of trait errors.Comment: 9 pages, 2 figure
A Core Calculus for Documents
Passive documents and active programs now widely comingle. Document languages
include Turing-complete programming elements, and programming languages include
sophisticated document notations. However, there are no formal foundations that
model these languages. This matters because the interaction between document
and program can be subtle and error-prone. In this paper we describe several
such problems, then taxonomize and formalize document languages as levels of a
document calculus. We employ the calculus as a foundation for implementing
complex features such as reactivity, as well as for proving theorems about the
boundary of content and computation. We intend for the document calculus to
provide a theoretical basis for new document languages, and to assist designers
in cleaning up the unsavory corners of existing languages.Comment: Published at POPL 202
A Grounded Conceptual Model for Ownership Types in Rust
Programmers learning Rust struggle to understand ownership types, Rust's core
mechanism for ensuring memory safety without garbage collection. This paper
describes our attempt to systematically design a pedagogy for ownership types.
First, we studied Rust developers' misconceptions of ownership to create the
Ownership Inventory, a new instrument for measuring a person's knowledge of
ownership. We found that Rust learners could not connect Rust's static and
dynamic semantics, such as determining why an ill-typed program would (or would
not) exhibit undefined behavior. Second, we created a conceptual model of
Rust's semantics that explains borrow checking in terms of flow-sensitive
permissions on paths into memory. Third, we implemented a Rust compiler plugin
that visualizes programs under the model. Fourth, we integrated the permissions
model and visualizations into a broader pedagogy of ownership by writing a new
ownership chapter for The Rust Programming Language, a popular Rust textbook.
Fifth, we evaluated an initial deployment of our pedagogy against the original
version, using reader responses to the Ownership Inventory as a point of
comparison. Thus far, the new pedagogy has improved learner scores on the
Ownership Inventory by an average of 9% ().Comment: Published at OOPSLA 202
The heuristics of narrativity in the works of Jean-Philippe Toussaint
This thesis analyses nine novels and two films by Jean-Philippe Toussaint, spanning the period from La Salle de bain (1985) to Nue (2013). Drawing on the hermeneutic phenomenology of Paul Ricoeur, it argues that Toussaint's texts can be fruitfully understood as representing fictionalised forms of reflexive narrativity.
Through the close readings of the texts developed in this thesis, it is argued that Toussaint's anonymous fictional narrators are presented as both the readers and writers of their own lives, engaged in reimagining their own past experiences in ways which are heuristically motivated towards future possibilities for action, and that these reimaginings are represented both as and through the formal variations of the texts themselves. Also emphasised, however, is the way in which such refigurative narrative engagements are frequently depicted as deceptive or problematic.
The first chapter, Self in the World, analyses La Salle de bain (1985), L'Appareil-photo (1988) and La RĂ©ticence (1991), focusing on the ways in which Toussaint's novels engage with thematic issues of subjectivity, identity, agency and the human capacity for reflexive narrativity.
The second chapter, The Other in the Self, analyses two novels, Monsieur (1986) and La Télévision (1997), and two films, La Sévillane (1992) and La Patinoire (1999), focusing on the ways in which Toussaint's texts deploy various forms of ironic discourse in the critical mediation of the relationship between individual subjectivity and the exigencies of society, the workplace, and problems related to creative agency.
The final chapter, Selfhood in the Other, analyses the novels of Toussaint's Marie tetralogy, Faire l’amour (2002), Fuir (2005), La Vérité sur Marie (2009), and Nue (2013), focusing on how this series interrogates philosophical questions of intersubjectivity by drawing on a number of historical conceptualisations of the aesthetic concept of the sublime